bitkeeper revision 1.7.1.8 (3dfdbdfbe2pZAGaXI4oPfJVdSW3qpg)
authorakw27@labyrinth.cl.cam.ac.uk <akw27@labyrinth.cl.cam.ac.uk>
Mon, 16 Dec 2002 11:50:19 +0000 (11:50 +0000)
committerakw27@labyrinth.cl.cam.ac.uk <akw27@labyrinth.cl.cam.ac.uk>
Mon, 16 Dec 2002 11:50:19 +0000 (11:50 +0000)
minor cleaning up.

xen-2.4.16/common/network.c
xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h
xen-2.4.16/include/xeno/vif.h
xen-2.4.16/net/dev.c
xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c

index 69b42949509f0701fd76cdc6006cf9b6351e1540..64c32a704f951f6c3738da015653e6859a368b3a 100644 (file)
@@ -1,8 +1,11 @@
-/* net_ring.c
+/* network.c
  *
- * ring data structures for buffering messages between hypervisor and
- * guestos's.  As it stands this is only used for network buffer exchange.
+ * Network virtualization for Xen.  Lower-level network interactions are in 
+ * net/dev.c and in the drivers.  This file contains routines to interact 
+ * with the virtual interfaces (vifs) and the virtual firewall/router through
+ * the use of rules.
  *
+ * Copyright (c) 2002, A K Warfield and K A Fraser
  */
 
 #include <hypervisor-ifs/network.h>
 
 /* vif globals 
  * sys_vif_list is a lookup table for vifs, used in packet forwarding.
- * it should be replaced later by something a little more flexible.
+ * it will be replaced later by something a little more flexible.
  */
 
-int sys_vif_count;
-net_vif_t *sys_vif_list[MAX_SYSTEM_VIFS];
-net_rule_ent_t *net_rule_list;
-kmem_cache_t *net_vif_cache;
+int sys_vif_count;                                  /* global vif count */
+net_vif_t *sys_vif_list[MAX_SYSTEM_VIFS];           /* global vif array */
+net_rule_ent_t *net_rule_list;                      /* global list of rules */
+kmem_cache_t *net_vif_cache;                        
 kmem_cache_t *net_rule_cache;
-static rwlock_t net_rule_lock = RW_LOCK_UNLOCKED;
-static rwlock_t sys_vif_lock = RW_LOCK_UNLOCKED;
+static rwlock_t net_rule_lock = RW_LOCK_UNLOCKED;   /* rule mutex */
+static rwlock_t sys_vif_lock = RW_LOCK_UNLOCKED;    /* vif mutex */
 
 void print_net_rule_list();
 
+
+/* ----[ VIF Functions ]----------------------------------------------------*/
+
+/* create_net_vif - Create a new vif and append it to the specified domain.
+ * 
+ * the domain is examined to determine how many vifs currently are allocated
+ * and the newly allocated vif is appended.  The vif is also added to the
+ * global list.
+ * 
+ */
+
 net_vif_t *create_net_vif(int domain)
 {
     net_vif_t *new_vif;
@@ -65,9 +79,12 @@ net_vif_t *create_net_vif(int domain)
     return new_vif;
 }
 
-/* delete the last vif in the given domain. There doesn't seem to be any reason
- * (yet) to be able to axe an arbitrary vif, by vif id. 
+/* delete_net_vif - Delete the last vif in the given domain. 
+ *
+ * There doesn't seem to be any reason (yet) to be able to axe an arbitrary 
+ * vif, by vif id. 
  */
+
 void destroy_net_vif(struct task_struct *p)
 {
     struct sk_buff *skb;
@@ -88,6 +105,9 @@ void destroy_net_vif(struct task_struct *p)
     kmem_cache_free(net_vif_cache, p->net_vif_list[i]);
 }
 
+/* print_vif_list - Print the contents of the global vif table.
+ */
+
 void print_vif_list()
 {
     int i;
@@ -103,6 +123,11 @@ void print_vif_list()
     }
 }
 
+/* ----[ Net Rule Functions ]-----------------------------------------------*/
+
+/* add_net_rule - Add a new network filter rule.
+ */
+
 int add_net_rule(net_rule_t *rule)
 {
     net_rule_ent_t *new_ent;
@@ -122,6 +147,9 @@ int add_net_rule(net_rule_t *rule)
     return 0;
 }
 
+/* delete_net_rule - Delete an existing network rule.
+ */
+
 int delete_net_rule(net_rule_t *rule)
 {
     net_rule_ent_t *ent = net_rule_list, *prev = NULL;
@@ -148,10 +176,12 @@ int delete_net_rule(net_rule_t *rule)
     return 0;
 }
  
-/* add_default_net_rule.
+/* add_default_net_rule - Set up default network path (ie for dom0).
+ * 
  * this is a utility function to route all traffic with the specified
  * ip address to the specified vif.  It's used to set up domain zero.
  */
+
 void add_default_net_rule(int vif_id, u32 ipaddr)
 {
     net_rule_t new_rule;
@@ -178,6 +208,9 @@ void add_default_net_rule(int vif_id, u32 ipaddr)
 
 }
 
+/* print_net_rule - Print a single net rule.
+ */
+
 void print_net_rule(net_rule_t *r)
 {
     printk("===] NET RULE:\n");
@@ -195,11 +228,18 @@ void print_net_rule(net_rule_t *r)
     printk("=] action           : %u\n", r->action);
 }
 
+/* print_net_rule_list - Print the global rule table.
+ */
+
 void print_net_rule_list()
 {
-    net_rule_ent_t *ent = net_rule_list;
+    net_rule_ent_t *ent;
     int count = 0;
     
+    read_lock(&net_rule_lock);
+
+    ent = net_rule_list;
+    
     while (ent) 
     {
         print_net_rule(&ent->r);
@@ -207,10 +247,14 @@ void print_net_rule_list()
         count++;
     }
     printk("\nTotal of %d rules.\n", count);
+
+    read_unlock(&net_rule_lock);
 }
 
-/* Apply the rules to this skbuff and return the vif id that it is bound for.
- * -1 to drop.
+/* net_find_rule - Find the destination vif according to the current rules.
+ *
+ * Apply the rules to this skbuff and return the vif id that it is bound for.
+ * If there is no match, VIF_DROP is returned.
  */
 
 int net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port, u16 dst_port, 
@@ -252,6 +296,25 @@ int net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port
     return dest;
 }
 
+/* net_get_target_vif - Find the vif that the given sk_buff is bound for.
+ *
+ * This is intended to be the main interface to the VFR rules, where 
+ * net_find_rule (above) is a private aspect of the current matching 
+ * implementation.  All in-hypervisor routing should use this function only
+ * to ensure that this can be rewritten later.
+ *
+ * Currently, network rules are stored in a global linked list.  New rules are
+ * added to the front of this list, and (at present) the first matching rule
+ * determines the vif that a packet is sent to.  This is obviously not ideal,
+ * it might be more advisable to have chains, or at lest most-specific 
+ * matching, and moreover routing latency increases linearly (for old rules)
+ * as new rules are added.  
+ *
+ * net_get_target_vif examines the sk_buff and pulls out the relevant fields
+ * based on the packet type.  it then calls net_find_rule to scan the rule 
+ * list.
+ */
+
 int net_get_target_vif(struct sk_buff *skb)
 {
     int target = VIF_DROP;
@@ -296,6 +359,8 @@ int net_get_target_vif(struct sk_buff *skb)
     return VIF_DROP;
 }
 
+/* ----[ Syscall Interface ]------------------------------------------------*/
+
 /* 
  * This is the hook function to handle guest-invoked traps requesting 
  * changes to the network system.
index c8ba7f278e7485d723a42d8e7cb6f913d6f43371..ad3fb2cfa8f4d408a15ad0f84d771a035d28a4e5 100644 (file)
@@ -44,127 +44,6 @@ typedef struct
 #define TRAP_INSTR "int $0x82"
 
 
-static inline int HYPERVISOR_set_trap_table(trap_info_t *table)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_trap_table),
-        "b" (table) );
-
-    return ret;
-}
-
-
-static inline int HYPERVISOR_pt_update(page_update_request_t *req, int count)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_pt_update), 
-        "b" (req), "c" (count) );
-
-    return ret;
-}
-
-
-static inline int HYPERVISOR_console_write(const char *str, int count)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_console_write), 
-        "b" (str), "c" (count) );
-
-
-    return ret;
-}
-
-static inline int HYPERVISOR_set_pagetable(unsigned long ptr)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_pagetable),
-        "b" (ptr) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_set_guest_stack(
-    unsigned long ss, unsigned long esp)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_guest_stack),
-        "b" (ss), "c" (esp) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_net_update(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_net_update) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_fpu_taskswitch(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_fpu_taskswitch) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_yield(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_yield) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_exit(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_exit) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_dom0_op(void *dom0_op)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_dom0_op),
-        "b" (dom0_op) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_network_op(void *network_op)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_network_op),
-        "b" (network_op) );
-
-    return ret;
-}
-
 /* Event message note:
  *
  * Here, as in the interrupts to the guestos, additional network interfaces
index 2a2612ec7021ce0735321a9d0cba9c07667c1672..1bef565c32f85b51045d2d0c231d1bb13a16b4ad 100644 (file)
@@ -1,7 +1,9 @@
 /* vif.h
  * 
- * this is the hypervisor end of the network code.  The net_ring structure
+ * This is the hypervisor end of the network code.  The net_ring structure
  * stored in each vif is placed on a shared page to interact with the guest VM.
+ *
+ * Copyright (c) 2002, A K Warfield and K A Fraser
  */
 
 /* virtual network interface struct and associated defines. */
@@ -26,7 +28,7 @@ typedef struct net_vif_st {
 
 /* VIF-related defines. */
 #define MAX_GUEST_VIFS    2 // each VIF is a small overhead in task_struct
-#define MAX_SYSTEM_VIFS 256 // trying to avoid dynamic allocation 
+#define MAX_SYSTEM_VIFS 256  
 
 /* vif globals */
 extern int sys_vif_count;
index cd3a4e38d3421a2069006c38a0d880c37249a365..5c4d999bf32a84559390bf4ad638b4e19b9c7184 100644 (file)
@@ -687,7 +687,6 @@ int netif_rx(struct sk_buff *skb)
         unsigned long cpu_mask;
 #endif
         struct task_struct *p;
-//        unsigned int dest_dom;
        int this_cpu = smp_processor_id();
        struct softnet_data *queue;
        unsigned long flags;
@@ -703,58 +702,29 @@ int netif_rx(struct sk_buff *skb)
        local_irq_save(flags);
         
        netdev_rx_stat[this_cpu].total++;
-/*
-        skb->h.raw = skb->nh.raw = skb->data;
-        
-        if ( skb->len < 2 ) goto drop;
-        switch ( ntohs(skb->mac.ethernet->h_proto) )
-        {
-        case ETH_P_ARP:
-            if ( skb->len < 28 ) goto drop;
-            dest_dom = ntohl(*(unsigned long *)
-                             (skb->nh.raw + 24));
-            break;
-        case ETH_P_IP:
-            if ( skb->len < 20 ) goto drop;
-            dest_dom = ntohl(*(unsigned long *)
-                             (skb->nh.raw + 16));
-            break;
-        default:
-            goto drop;
-        }
-        
-        if ( (dest_dom < opt_ipbase) ||
-             (dest_dom > (opt_ipbase + 16)) )
-            goto drop;
-        
-        dest_dom -= opt_ipbase;
-        
-        read_lock(&tasklist_lock);
-        p = &idle0_task;
-        do {
-            if ( p->domain != dest_dom ) continue;
-            skb_queue_tail(&p->net_vif_list[0]->skb_list, skb); // vfr will fix.
-            cpu_mask = mark_hyp_event(p, _HYP_EVENT_NET_RX);
-            read_unlock(&tasklist_lock);
-            goto found;
-        }
-        while ( (p = p->next_task) != &idle0_task );
-        read_unlock(&tasklist_lock);
-        goto drop;
-*/
+
         if (skb->src_vif == VIF_UNKNOWN_INTERFACE)
             skb->src_vif = VIF_PHYSICAL_INTERFACE;
 
         if (skb->dst_vif == VIF_UNKNOWN_INTERFACE)
             net_get_target_vif(skb);
-if (skb->dst_vif > 1)
-printk("netifrx got packet bound for system vif %d.\n", skb->dst_vif);
+        
         if (sys_vif_list[skb->dst_vif] == NULL)
         {
             // the target vif does not exist.
             goto drop;
         }
 
+        /* This lock-and-walk of the task list isn't really necessary, and is an
+         * artifact of the old code.  The vif contains a pointer to the skb list 
+         * we are going to queue the packet in, so the lock and the inner loop
+         * could be removed.
+         *
+         * The argument against this is a possible race in which a domain is killed
+         * as packets are being delivered to it.  This would result in the dest vif
+         * vanishing before we can deliver to it.
+         */
+        
         if ( skb->dst_vif >= VIF_PHYSICAL_INTERFACE )
         {
             read_lock(&tasklist_lock);
@@ -770,19 +740,6 @@ printk("netifrx got packet bound for system vif %d.\n", skb->dst_vif);
             read_unlock(&tasklist_lock); 
             goto drop;
         }
-// found:
-#if 0
-        __skb_queue_tail(&queue->input_pkt_queue,skb);
-        /* Runs from irqs or BH's, no need to wake BH */
-        cpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ);
-        local_irq_restore(flags);
-        get_sample_stats(this_cpu);
-        return softnet_data[this_cpu].cng_level;
-//#else
-        hyp_event_notify(cpu_mask);
-        local_irq_restore(flags);
-        return 0;
-#endif
 
 drop:
        netdev_rx_stat[this_cpu].dropped++;
@@ -943,8 +900,6 @@ void flush_rx_queue(void)
         while ( (skb = skb_dequeue(&current->net_vif_list[nvif]->skb_list)) 
                         != NULL )
         {
-if (nvif > 0)
-printk("flushrxqueue on vif %d (sys: %d) (pkt_type=%d)\n", nvif, current->net_vif_list[nvif]->id, skb->pkt_type);
             /*
              * Write the virtual MAC address into the destination field
              * of the ethernet packet. Furthermore, do the same for ARP
@@ -952,15 +907,15 @@ printk("flushrxqueue on vif %d (sys: %d) (pkt_type=%d)\n", nvif, current->net_vi
              * is always 00-00-00-00-00-00.
              *
              * Actually, the MAC address is now all zeros, except for the
-             * first sixteen bits, which are the per-host vif id.
-             * (so eth0 should be 00-00-..., eth1 is 01-00-...)
+             * second sixteen bits, which are the per-host vif id.
+             * (so eth0 should be 00-00-..., eth1 is 00-01-...)
              */
             memset(skb->mac.ethernet->h_dest, 0, ETH_ALEN);
-            *(unsigned int *)(skb->mac.ethernet->h_dest) = nvif;
+            *(unsigned int *)(skb->mac.ethernet->h_dest + 1) = nvif;
             if ( ntohs(skb->mac.ethernet->h_proto) == ETH_P_ARP )
             {
                 memset(skb->nh.raw + 18, 0, ETH_ALEN);
-                *(unsigned int *)(skb->nh.raw + 18) = nvif;
+                *(unsigned int *)(skb->nh.raw + 18 + 1) = nvif;
             }
 
             i = net_ring->rx_cons;
@@ -1978,8 +1933,6 @@ long do_net_update(void)
         net_ring = current_vif->net_ring;
         for ( i = net_ring->tx_cons; i != net_ring->tx_prod; i = TX_RING_INC(i) )
         {
-if (j > 0)
-printk("net_update called with packet on vif %d system: %d)\n", j, current_vif->id);
             if ( copy_from_user(&tx, net_ring->tx_ring+i, sizeof(tx)) )
                 continue;
 
@@ -2028,40 +1981,21 @@ printk("net_update called with packet on vif %d system: %d)\n", j, current_vif->
                 net_get_target_vif(skb);
                 if ( skb->dst_vif > VIF_PHYSICAL_INTERFACE )
                 {
-if (j > 0)
-    printk("Sent to netif_rx.\n");
                     if (netif_rx(skb) == 0)
                         /* Give up non-local reference. Packet delivered locally. */
                         kfree_skb(skb);
                 }
                 else if ( skb->dst_vif == VIF_PHYSICAL_INTERFACE )
                 {
-if (j > 0)
-    printk("Sent to physical device.\n");
 
                         skb_push(skb, skb->dev->hard_header_len);
                         dev_queue_xmit(skb);
                 } 
                 else
                 {
-if (j > 0)
-    printk("dropped.\n");
                     kfree_skb(skb);
                 }
 
-                /*
-                skb_get(skb); 
-                skb->protocol = eth_type_trans(skb, skb->dev);
-                if ( netif_rx(skb) == 0 )
-                {
-                    kfree_skb(skb);
-                }
-                else
-                {
-                    skb_push(skb, skb->dev->hard_header_len);
-                    dev_queue_xmit(skb);
-                }
-                */
             }
         }
         net_ring->tx_cons = i;
index c4b4a9cc9d70fb4436b57c54dd18fc4d75413b4b..b018e29e49e5cde4d2c04ae96488444cb755272f 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 #include <linux/init.h>
-#include <linux/ip.h> //remove this.
 
 #include <net/sock.h>
 
@@ -226,11 +225,6 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
     unsigned int i;
     struct net_private *np = (struct net_private *)dev->priv;
     
-if ((np->id > 0) || ((skb->len > 20) 
-                && (skb->nh.iph != NULL) 
-                && (skb->nh.iph->protocol == 1)))
-    printk(KERN_WARNING "TX on vif %d (dev:%p)\n", np->id, dev);
-    
     if ( np->tx_full )
     {
         printk(KERN_WARNING "%s: full queue wasn't stopped!\n", dev->name);
@@ -287,17 +281,8 @@ static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs)
         skb->protocol = eth_type_trans(skb, dev);
         np->stats.rx_packets++;
         np->stats.rx_bytes += np->net_ring->rx_ring[i].size;
-
-if (((skb->len > 20)
-    && ((*(unsigned char *)(skb->data + 9) == 1) || (np->id > 0)) ))
-    printk(KERN_WARNING "RX on vif %d (dev:%p)\n", np->id, dev);
-if ((skb != NULL) && (skb->data != NULL) && (skb->len > 20) && ntohl(*(unsigned long *)(skb->data + 16)) == 167903489)
-    printk(KERN_WARNING "RX INT (driver): pkt_type is %d.!", skb->pkt_type);
-
         netif_rx(skb);
         dev->last_rx = jiffies;
-                
-
     }
 
     np->rx_idx = i;
@@ -307,7 +292,6 @@ if ((skb != NULL) && (skb->data != NULL) && (skb->len > 20) && ntohl(*(unsigned
     /* Deal with hypervisor racing our resetting of rx_event. */
     smp_mb();
     if ( np->net_ring->rx_cons != i ) { 
-//printk("redoing network rx...\n"); 
                 goto again;
         }
 }
@@ -371,7 +355,7 @@ int __init init_module(void)
         dev->get_stats       = network_get_stats;
 
         memset(dev->dev_addr, 0, ETH_ALEN);
-        *(unsigned int *)(dev->dev_addr) = i;
+        *(unsigned int *)(dev->dev_addr + 1) = i;
 
         if ( (err = register_netdev(dev)) != 0 )
         {
@@ -382,7 +366,6 @@ int __init init_module(void)
         np->dev = dev;
         np->id = i;
         list_add(&np->list, &dev_list);
-printk(KERN_WARNING "Added VIF, ifindex is %d.\n", dev->ifindex);
     }
 
     return 0;